package org.cn.zhaozhx.util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 将指定目录下的某些文件批量转换编码
 * @author zhaozhx
 */
public class DirOper {
    
    // 文件路径 文件名称集合
    protected List<Map<String, String>> readFilePathList = new ArrayList<Map<String, String>>(0);
    
    /**
     * 修改某个目录的下指定文件的编码
     * @param dirFile 要转换的目录
     * @param desEncoding 要转换的编码
     * @param convertFiles 需要转换的文件后缀名
     * @param filterFiles 要过滤文件、文件后缀名
     * @throws IOException
     */
    public void changeDirFileEncoding(File dirFile, String desEncoding, String convertFiles[], String[] filterFiles)
            throws IOException {
        this.getDirFiles(dirFile, convertFiles, filterFiles);
        if (null != readFilePathList && readFilePathList.size() > 0) {
            for (Map<String, String> map : readFilePathList) {
                String fName = map.get("name");
                String fPath = map.get("path");
                String file = fPath + System.getProperty("file.separator") + fName;
                // 获取文件编码
                String srcEncoding = FileCharsetInfo.getFileCharSet(file);
                System.out.println("文件名称：" + file);
                // 文件编码不为 utf-8 的都按 gb2312 去读取
                if (null == srcEncoding) {
                    srcEncoding = "gb2312";
                }
                if ("UTF-8".equals(srcEncoding)) {
                    continue;
                }
                if (srcEncoding.equals(desEncoding)) {
                    continue;
                }
                System.out.println("文件编码：" + srcEncoding);
                // 读文件
                String fileContent = this.readFile(file, "gb2312");
                // 写文件
                this.writeFile(fPath, fName, fileContent, desEncoding);
            }
        } else {
            return;
        }
    }
    
    /**
     * 读文件
     * 
     * @param file
     *            文件路径
     * @param encoding
     *            文件当前编码
     * @return
     */
    private String readFile(String file, String encoding) {
        if (null == encoding || "".equals(encoding)) {
            return ReadFile.getFileContent(file);
        } else {
            return ReadFile.getFileContent(new File(file), encoding);
        }
    }
    
    /**
     * 写文件
     * @param fileContent 文件内容
     * @param encoding 文件编码
     */
    private void writeFile(String filePath, String fileName, String fileContent, String encoding) {
        WriteFile.write(filePath, fileName, fileContent, false, encoding);
    }
    
    // 递归方法
    @SuppressWarnings("unused")
    private static void tree(File f) {
        File[] childs = f.listFiles();
        for (int i = 0; i < childs.length; i++) {
            System.out.println(childs[i].getName());
            if (childs[i].isDirectory()) {
                tree(childs[i]);
            }
        }
    }
    
    /**
     * 递归方式将文件信息存储到readFilePathList中
     * @param dirFile   目录
     * @param convertFiles 需要转换的文件后缀名
     * @param filterFiles 要过滤文件、文件后缀名
     */
    private void getDirFiles(File dirFile, String convertFiles[], String[] filterFiles) {
        List<String> convertList = strings2List(convertFiles);
        List<String> filterList = strings2List(filterFiles);
        File files[] = dirFile.listFiles();
        
        for (File tmpFile : files) {
            if (tmpFile.isFile()) {
                //文件名
                String fileName = tmpFile.getName();
                //后缀名
                String suffix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
                //过滤不转换的文件
                if (null != filterList && filterList.contains(suffix)) {
                    continue;
                }
                //处理要转换的文件
                if (null != convertList && convertList.contains(suffix)) {
                    String fPath = tmpFile.getParent();
                    String fName = tmpFile.getName();
                    Map<String, String> map = new HashMap<String, String>();
                    map.put("path", fPath);
                    map.put("name", fName);
                    readFilePathList.add(map);
                }
                
            }
            if (tmpFile.isDirectory()) {
                this.getDirFiles(tmpFile, convertFiles, filterFiles);
            }
        }
    }
    
    private List<String> strings2List(String[] strs) {
        List<String> list = null;
        if (null != strs && strs.length > 0) {
            list = new ArrayList<String>();
            for (String str : strs) {
                list.add(str);
            }
        }
        return list;
    }
    
    public static void main(String[] args) {
        DirOper oper = new DirOper();
        String operPath = "D:/zhaozhx/webservice/Spider-t";
        String filterFiles[] = new String[] {};
        String convertFiles[] = new String[] { "java" };
        try {
            oper.changeDirFileEncoding(new File(operPath), "utf-8", convertFiles, filterFiles);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}